﻿package pluginfw.nio
{
    import flash.utils.*;

    public class Output extends Object
    {
        protected var buffer:ByteArray;

        public function Output()
        {
            this.buffer = new ByteArray();
            return;
        }

        public function getBuffer() : ByteArray
        {
            return this.buffer;
        }

        public function write(param1:int) : void
        {
            this.buffer.writeByte(param1);
            return;
        }

        public function writeBytes(param1:ByteArray, param2:int, param3:int) : void
        {
            this.buffer.writeBytes(param1, param2, param3);
            return;
        }

        public function writeByte(param1:int) : void
        {
            this.buffer.writeByte(param1);
            return;
        }

        public function writeInt(param1:int) : void
        {
            this.buffer.writeInt(param1);
            return;
        }

        public function writeVarInt(param1:int, param2:Boolean) : int
        {
            if (!param2)
            {
                param1 = param1 << 1 ^ param1 >> 31;
            }
            if (param1 >>> 7 == 0)
            {
                this.buffer.writeByte(param1 & 255);
                return 1;
            }
            if (param1 >>> 14 == 0)
            {
                this.buffer.writeByte((param1 & 127 | 128) & 255);
                this.buffer.writeByte(param1 >>> 7 & 255);
                return 2;
            }
            if (param1 >>> 21 == 0)
            {
                this.buffer.writeByte((param1 & 127 | 128) & 255);
                this.buffer.writeByte((param1 >>> 7 | 128) & 255);
                this.buffer.writeByte(param1 >>> 14 & 255);
                return 3;
            }
            if (param1 >>> 28 == 0)
            {
                this.buffer.writeByte((param1 & 127 | 128) & 255);
                this.buffer.writeByte((param1 >>> 7 | 128) & 255);
                this.buffer.writeByte((param1 >>> 14 | 128) & 255);
                this.buffer.writeByte(param1 >>> 21 & 255);
                return 4;
            }
            this.buffer.writeByte((param1 & 127 | 128) & 255);
            this.buffer.writeByte((param1 >>> 7 | 128) & 255);
            this.buffer.writeByte((param1 >>> 14 | 128) & 255);
            this.buffer.writeByte((param1 >>> 21 | 128) & 255);
            this.buffer.writeByte(param1 >>> 28 & 255);
            return 5;
        }

        public function writeVarLong(param1:Long, param2:Boolean) : int
        {
            if (!param2)
            {
                param1 = param1.leftShift(1).xor(param1.rightShift(63));
            }
            if (param1.rightShift(7, true).isZero())
            {
                this.buffer.writeByte(param1.getLow());
                return 1;
            }
            if (param1.rightShift(14, true).isZero())
            {
                this.buffer.writeByte(param1.and(127).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(7, true).getLow());
                return 2;
            }
            if (param1.rightShift(21, true).isZero())
            {
                this.buffer.writeByte(param1.and(127).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(7, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(14, true).getLow());
                return 3;
            }
            if (param1.rightShift(28, true).isZero())
            {
                this.buffer.writeByte(param1.and(127).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(7, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(14, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(21, true).getLow());
                return 4;
            }
            if (param1.rightShift(35, true).isZero())
            {
                this.buffer.writeByte(param1.and(127).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(7, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(14, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(21, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(28, true).getLow());
                return 5;
            }
            if (param1.rightShift(42, true).isZero())
            {
                this.buffer.writeByte(param1.and(127).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(7, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(14, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(21, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(28, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(35, true).getLow());
                return 6;
            }
            if (param1.rightShift(49, true).isZero())
            {
                this.buffer.writeByte(param1.and(127).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(7, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(14, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(21, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(28, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(35, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(42, true).getLow());
                return 7;
            }
            if (param1.rightShift(56, true).isZero())
            {
                this.buffer.writeByte(param1.and(127).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(7, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(14, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(21, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(28, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(35, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(42, true).or(128).getLow());
                this.buffer.writeByte(param1.rightShift(49, true).getLow());
                return 8;
            }
            this.buffer.writeByte(param1.and(127).or(128).getLow());
            this.buffer.writeByte(param1.rightShift(7, true).or(128).getLow());
            this.buffer.writeByte(param1.rightShift(14, true).or(128).getLow());
            this.buffer.writeByte(param1.rightShift(21, true).or(128).getLow());
            this.buffer.writeByte(param1.rightShift(28, true).or(128).getLow());
            this.buffer.writeByte(param1.rightShift(35, true).or(128).getLow());
            this.buffer.writeByte(param1.rightShift(42, true).or(128).getLow());
            this.buffer.writeByte(param1.rightShift(49, true).or(128).getLow());
            this.buffer.writeByte(param1.rightShift(56, true).getLow());
            return 9;
        }

        public function writeString(param1:String) : void
        {
            var _loc_4:int = 0;
            var _loc_5:int = 0;
            var _loc_6:int = 0;
            var _loc_7:int = 0;
            if (param1 == null)
            {
                this.writeByte(128);
                return;
            }
            var _loc_2:* = param1.length;
            if (_loc_2 == 0)
            {
                this.writeByte(1 | 128);
                return;
            }
            var _loc_3:Boolean = false;
            if (_loc_2 > 1 && _loc_2 < 64)
            {
                _loc_3 = true;
                _loc_4 = 0;
                while (_loc_4 < _loc_2)
                {
                    
                    _loc_5 = param1.charCodeAt(_loc_4);
                    if (_loc_5 > 127)
                    {
                        _loc_3 = false;
                        break;
                    }
                    _loc_4 = _loc_4 + 1;
                }
            }
            if (_loc_3)
            {
                this.buffer.writeUTFBytes(param1);
                this.buffer[(this.buffer.position - 1)] = this.buffer[(this.buffer.position - 1)] | 128;
            }
            else
            {
                this.writeUtf8Length((_loc_2 + 1));
                _loc_6 = 0;
                _loc_7 = this.buffer.position;
                while (_loc_6 < _loc_2)
                {
                    
                    _loc_5 = param1.charCodeAt(_loc_6);
                    if (_loc_5 > 127)
                    {
                        break;
                    }
                    this.buffer.writeByte(_loc_5 & 255);
                    _loc_7 = _loc_7 + 1;
                    _loc_6 = _loc_6 + 1;
                }
                this.buffer.position = _loc_7;
                if (_loc_6 < _loc_2)
                {
                    this.writeString_slow(param1, _loc_2, _loc_6);
                }
            }
            return;
        }

        public function writeAscii(param1:String) : void
        {
            if (param1 == null)
            {
                this.writeByte(128);
                return;
            }
            var _loc_2:* = param1.length;
            switch(_loc_2)
            {
                case 0:
                {
                    this.writeByte(1 | 128);
                    return;
                }
                case 1:
                {
                    this.writeByte(2 | 128);
                    this.writeByte(param1.charCodeAt(0));
                    return;
                }
                default:
                {
                    break;
                }
            }
            this.buffer.writeUTF(param1);
            this.buffer[(this.buffer.position - 1)] = this.buffer[(this.buffer.position - 1)] | 128;
            return;
        }

        private function writeUtf8Length(param1:int) : void
        {
            if (param1 >>> 6 == 0)
            {
                this.buffer.writeByte((param1 | 128) & 255);
            }
            else if (param1 >>> 13 == 0)
            {
                this.buffer.writeByte((param1 | 64 | 128) & 255);
                this.buffer.writeByte(param1 >>> 6 & 255);
            }
            else if (param1 >>> 20 == 0)
            {
                this.buffer.writeByte((param1 | 64 | 128) & 255);
                this.buffer.writeByte((param1 >>> 6 | 128) & 255);
                this.buffer.writeByte(param1 >>> 13 & 255);
            }
            else if (param1 >>> 27 == 0)
            {
                this.buffer.writeByte((param1 | 64 | 128) & 255);
                this.buffer.writeByte((param1 >>> 6 | 128) & 255);
                this.buffer.writeByte((param1 >>> 13 | 128) & 255);
                this.buffer.writeByte(param1 >>> 20 & 255);
            }
            else
            {
                this.buffer.writeByte((param1 | 64 | 128) & 255);
                this.buffer.writeByte((param1 >>> 6 | 128) & 255);
                this.buffer.writeByte((param1 >>> 13 | 128) & 255);
                this.buffer.writeByte((param1 >>> 20 | 128) & 255);
                this.buffer.writeByte(param1 >>> 27 & 255);
            }
            return;
        }

        private function writeString_slow(param1:String, param2:int, param3:int) : void
        {
            var _loc_4:int = 0;
            while (param3 < param2)
            {
                
                _loc_4 = param1.charCodeAt(param3);
                if (_loc_4 <= 127)
                {
                    this.buffer.writeByte(_loc_4 & 255);
                }
                else if (_loc_4 > 2047)
                {
                    this.buffer.writeByte((224 | _loc_4 >> 12 & 15) & 255);
                    this.buffer.writeByte((128 | _loc_4 >> 6 & 63) & 255);
                    this.buffer.writeByte((128 | _loc_4 & 63) & 255);
                }
                else
                {
                    this.buffer.writeByte((192 | _loc_4 >> 6 & 31) & 255);
                    this.buffer.writeByte((128 | _loc_4 & 63) & 255);
                }
                param3 = param3 + 1;
            }
            return;
        }

        public function writeFloat(param1:Number) : void
        {
            this.buffer.writeFloat(param1);
            return;
        }

        public function writeFloat2(param1:Number, param2:Number, param3:Boolean) : void
        {
            this.writeVarInt(param1 * param2, param3);
            return;
        }

        public function writeShort(param1:int) : void
        {
            this.buffer.writeShort(param1);
            return;
        }

        public function writeLong(param1:Long) : void
        {
            this.buffer.writeByte(param1.getHigh() >>> 24);
            this.buffer.writeByte(param1.getHigh() >>> 16);
            this.buffer.writeByte(param1.getHigh() >>> 8);
            this.buffer.writeByte(param1.getHigh());
            this.buffer.writeByte(param1.getLow() >>> 24);
            this.buffer.writeByte(param1.getLow() >>> 16);
            this.buffer.writeByte(param1.getLow() >>> 8);
            this.buffer.writeByte(param1.getLow());
            return;
        }

        public function writeBoolean(param1:Boolean) : void
        {
            this.buffer.writeBoolean(param1);
            return;
        }

        public function writeChar(param1:int) : void
        {
            this.buffer.writeShort(param1);
            return;
        }

        public function writeDouble(param1:Number) : void
        {
            this.buffer.writeDouble(param1);
            return;
        }

        public function writeVarInts(param1:Vector.<int>, param2:Boolean) : void
        {
            var _loc_3:int = 0;
            var _loc_4:* = param1.length;
            while (_loc_3 < _loc_4)
            {
                
                this.writeVarInt(param1[_loc_3], param2);
                _loc_3 = _loc_3 + 1;
            }
            return;
        }

        public function writeInts(param1:Vector.<int>) : void
        {
            var _loc_2:int = 0;
            var _loc_3:* = param1.length;
            while (_loc_2 < _loc_3)
            {
                
                this.buffer.writeInt(param1[_loc_2]);
                _loc_2 = _loc_2 + 1;
            }
            return;
        }

        public function writeVarLongs(param1:Vector.<Long>, param2:Boolean) : void
        {
            var _loc_3:int = 0;
            var _loc_4:* = param1.length;
            while (_loc_3 < _loc_4)
            {
                
                this.writeVarLong(param1[_loc_3], param2);
                _loc_3 = _loc_3 + 1;
            }
            return;
        }

        public function writeLongs(param1:Vector.<Long>) : void
        {
            var _loc_2:int = 0;
            var _loc_3:* = param1.length;
            while (_loc_2 < _loc_3)
            {
                
                this.writeLong(param1[_loc_2]);
                _loc_2 = _loc_2 + 1;
            }
            return;
        }

        public function writeFloats(param1:Vector.<Number>) : void
        {
            var _loc_2:int = 0;
            var _loc_3:* = param1.length;
            while (_loc_2 < _loc_3)
            {
                
                this.writeFloat(param1[_loc_2]);
                _loc_2 = _loc_2 + 1;
            }
            return;
        }

        public function writeShorts(param1:Vector.<int>) : void
        {
            var _loc_2:int = 0;
            var _loc_3:* = param1.length;
            while (_loc_2 < _loc_3)
            {
                
                this.writeShort(param1[_loc_2]);
                _loc_2 = _loc_2 + 1;
            }
            return;
        }

        public function writeChars(param1:Vector.<int>) : void
        {
            var _loc_2:int = 0;
            var _loc_3:* = param1.length;
            while (_loc_2 < _loc_3)
            {
                
                this.writeChar(param1[_loc_2]);
                _loc_2 = _loc_2 + 1;
            }
            return;
        }

        public function writeDoubles(param1:Vector.<int>) : void
        {
            var _loc_2:int = 0;
            var _loc_3:* = param1.length;
            while (_loc_2 < _loc_3)
            {
                
                this.writeDouble(param1[_loc_2]);
                _loc_2 = _loc_2 + 1;
            }
            return;
        }

    }
}
